// msi/MSI.js
// MSI 条码编码器（Modified Plessey）
// 仅支持数字 0-9，常用于仓储、图书馆系统

import Barcode from '../Barcode.js';

/**
 * MSI (Modified Plessey) 条码类
 * 特点：
 * - 仅支持数字 0-9
 * - 每位数字用 4 位二进制编码（BCD）
 * - 每个 bit 编码为：0 → '100', 1 → '110'
 * - 起始码：'110'，结束码：'1001'
 * - 无校验位（基础 MSI）
 *
 * @see https://en.wikipedia.org/wiki/MSI_Barcode
 */
class MSI extends Barcode {
  /**
   * 构造函数
   * @param {string} data - 输入数据（纯数字）
   * @param {Object} options - 条码配置项
   */
  constructor(data, options) {
    super(data, options);
  }

  /**
   * 验证输入数据是否有效
   * 必须为纯数字字符串
   * @returns {boolean}
   */
  valid() {
    return /^[0-9]+$/.test(this.data);
  }

  /**
   * 编码核心方法
   * 将每位数字转为 4 位二进制（BCD），再逐位映射为脉冲序列
   * @returns {{ data: string, text: string }}
   */
  encode() {
    let result = '110'; // 起始码

    for (const char of this.data) {
      const digit = parseInt(char, 10);
      const binary = digit.toString(2).padStart(4, '0'); // 转为 4 位二进制

      // 每个 bit 映射为：0 → '100', 1 → '110'
      for (const bit of binary) {
        result += (bit === '0' ? '100' : '110');
      }
    }

    result += '1001'; // 结束码

    return {
      data: result,
      text: this.text
    };
  }
}

export default MSI;